您的位置:首页 > 新闻中心 > 资讯详情

Wings, 展开单元测试的翅膀


Wings-企业级单元用例自动编码引擎,星云测试全自主研发的高端单元测试产品。它让计算机先对被测试程序进行全局分析和深度理解,再由计算机进行全自动的完成单元测试编码,以验证开发人员编写的源代码逻辑输入输出的对错。在单元测试编写环节,效率可提高80-90%。

1. 背景

随着软件规模和软件质量的要求日益提升,以及敏捷迭代和极限编程等开发思想的逐渐普及,传统的倒金字塔形测试已经不再适用,测试的重点逐渐转向单元测试,即转变为更为稳定的正向测试金字塔结构。


图表 1 测试重点转向单元测试


2. 问题

单元测试会极大程度上增加开发者的工作量,据统计,在开发过程中,对单元进行充分测试会增加50%至80%的工作负荷。编写单元测试驱动的过程耗时耗力,时间成本和经济成本极高,而且开发人员主观不愿意花时间对于自己编写的代码进行测试。

同时,编写单元测试用例对于测试人员的编程能力要求较高,技术门槛的提升也间接提升了进行单元测试的成本。

况且,单元测试相关的设计和开展耗时过长,导致完整的单元测试无法在敏捷迭代中被有效开展的适配。

因此,越来越多的开发者和厂商,开始寻求一种稳定有效,成本适宜,并且能够适配敏捷开发的解决方案。

3. 解决问题

在这样的背景下,为有效解决上述提到的种种问题,Wings,作为一款能够有效解决种种行业痛点的工具,应运而生。

3.1 什么是Wings

Wings,企业级单元用例自动编码引擎,星云测试全自主研发的高端单元测试产品。它让计算机先对被测试程序进行全局分析和深度理解,再由计算机进行全自动的完成单元测试编码,以验证开发人员编写的源代码逻辑输入输出的对错。在单元测试编写环节,效率可提高80-90%。

Wings可以将任意复杂参数结构逐步分解为基本数据类型,并全自动生成测试驱动程序和参数捕获程序。Wings也支持生成多层次的可视化的数据表格来对变量进行赋值,使用者可以无需关注驱动程序本身。Wings对于复杂类型也具有有强大的处理能力。下文,将对Wings的工作流程,和独有的解决问题的能力,以及对应的应用场景进行概述性的介绍和分析。

3.2 Wings的工作流程

Wings利用代码静态分析技术,有效提取被测程序的主干信息,其主要步骤可以被概括为:

  1. 获取不同平台的编译数据库文件

  2. 依据编译数据库文件,对被测程序的源代码进行静态分析,将提取到的信息存储于Wings特有的PSD文件中。

  3. 读取PSD结构生成不同的文件,编译汇总成为测试程序,并运行得出测试结果。

  4. 读取分析PSD结构,获取起始测试参数。

图片

图表 2 Wings的整个架构

3.3 Wings解决问题的能力,以及其部分应用场景

3.3.1 生成驱动

Wings解决的最直接的问题,是对于测试驱动的生成。可以将任意复杂参数结构逐步分解为基本数据类型,并全自动生成测试驱动程序和参数捕获程序。Wings支持面向过程C语言以及面向对象C++语言的驱动生成和参数捕获,能够支持高级语言特性和基本的内置类型,支持被测函数运行必要的全局变量的构建和赋值。

同时,通过对于代码的深入理解和逻辑梳理,Wings能够快速,准确,有效的构建测试驱动代码。Wings使用的算法,可以有效的降低对代码的静态分析时间,对比某些传统的静态分析工具所需要的数小时解析和构建时间,wing能够实现每分钟100万行代码的构建速率,对于拥有数千万行代码的程序,其分析和构建的总时间均在分钟级,对于拥有大量函数(单元)的应用程序,Wings可以大大提升其单元测试的效率。更是远远超过人工理解代码和构建代码的速度。

图片

图表 3 Wings构建测试驱动代码(示例1)

图片

图表 4 Wings构建测试驱动代码(示例2)

3.3.2 逻辑解析(算法生成用例+数据展示)

Wings能够通过不同的算法,按照不同的目的,生成测试用例。包括:1. 随机算法:用于进行随机测试,可以针对单元测试,接口测试等;2. 符号执行:这种生成用例的方式,可以针对一些数值计算的函数以及模块;3. 搜索算法:通过变异方式结合覆盖生成用例;4. 程序分析:对程序进行深度的解析。

图片

图表 5 Wings测试用例生成智能算法

Wings的另一项核心能力,是其对于代码逻辑的解析,具体体现在支持生成单独的值文件(数据表格)。并且通过该数据表格多层次的可视化结构,来对变量进行赋值,而无需关注驱动程序本身。数据表格可以表达任意深度和多层次的数据关系,用户只需要对表格数据进行编辑,结合自动生成的驱动程序,会自动完成表格数据的读取和参数赋值的构造过程。

数据表格直观的特性,使得用户可以在脱离开发环境的基础上,即使不是专业的开发人员,也能对被测对象进行赋值和测试,同时,Wings的数据表格支持多组用例的生成,结合算法,可以实现包含边界值(临界值)在内的多组数据生成,实现更高的覆盖率。

图片

图表 6 Wings数据表格实例(1)

数据表格同样支持用户对其进行自定义编辑,尤其是涉及某些较为复杂的结构,用户可以采用比较灵活的赋值方式,考虑到实际应用中的一些因素,例如针对链表类型,默认赋值两层结构,在实际测试过程中,用户可依据需要自动添加节点。

图片

图表 7Wings数据表格实例(2)

而在针对void*与函数指针的类型,Wings首先会利用静态分析技术,获取函数参数为void *与函数指针时的具体赋值类型。分析该函数变量的赋值类型,并将赋值类型标记于数据表格界面,并在后续分析中,实现对该赋值类型的自动调用。

同时,针对一些利用分析技术无法确定的类型,Wings会将所有有关的函数展示在界面上,由用户自己选择需要的类型,驱动会处理相对应的类型。如下图所示:

图片

图表 8 Wings对于void*的解析和赋值

Wings对于特殊赋值类型的处理能力不止于此,还包括对于:结构体、类为系统变量;STL标准模版库;C++自定义模版类等特殊情况的处理。详情可以参考星云测试官方网站所发布的技术白皮书(http://www.teststars.cc)。

3.3.3 参数捕获

Wings还支持用户进行已完成测试的参数捕获,获得前序测试参数的意义在于,得到了已知结果的测试数据,并以此为依据和开端,可以显著降低初始化工作量,同时如果代码在迭代过程中发生变化, 可以通过对比前序测试数据,对于变化的源码进行有针对性的调整以评估迭代的影响。

参数捕获是通过在用户源码中插装Wings生成的参数捕获代码进行获取函数的参数数据,获取到的参数,全局变量和返回值,可以直接存放入PSD中,用于后续驱动代码的读取。参数捕获的过程示意图如下:

图片

图表 9 参数捕获过程示意图

3.3.4代码变更(回归测试)

Wings能够在迭代的过程中,对增量和变更的代码进行针对性的驱动生成和整合,并能将相关的信息反馈给用户。因为在测试过程中,对于变更代码的回归测试往往是用户最为关注的部分。Wings结合星云测试精准测试平台强大的数据分析和智能回归测试用例选取能力,为单元测试的智能回归测试提供了完备的解决方案。通过智能分析算法,有效的甄别函数的变更部分,并针对其生成单元测试驱动,结合精准测试平台,进行智能回归测试。

3.3.5随机测试

Wings支持通过随机测试数据的批量生成,进行随机测试,而且可以做到不仅仅是局限于单元,也可以扩展到模块和中间件。

随机测试的意义在于,能够对被测对象进行鲁棒测试。对于关键系统来说,需要在一定错误数据的扰动下,仍然能够不崩溃,并且保证正常的运行状态,鲁棒测试可以通过在较大范围内模拟随机的异常情况,检验被测对象在异常输入和苛刻环境条件下能否保持正常的工作运行状态。Wings对于随机测试的支持,表明了Wings在复杂系统和核心系统的适应性。

4. Wings的横向支持能力

Wings作为一款成熟的商用产品,可以实现对于不同开发环境,例如Qt,Visual Stuido,Workbench的支持,同时对于不同版本的C++(例如C++11,C++14,C++17,C++20等)也有完备的支持,保证其在不同环境下的高可用能力。Wings能够提供高效的可视化图形界面,几乎无需编程即可操作,同时可以提供综合的测试结果分析和管理报表。

在实现强大功能的前提下,得益于强大的优化,Wings的配置要求在同类产品中也很低,基础配置4核CPU和8g内存即可,也进一步体现了Wings对于成本(硬件成本)的优化和管控能力。

5. 结语

Wings,作为一款革命性的测试产品,有效的解决了传统单元测试编写过程繁杂冗长的问题,提升了单元测试的效率,为单元测试插上了飞翔的翅膀。Wings的多种能力和应用场景,是对于工业生产应用能力的坚实支撑,也让其拥有了成为数字化转型核心组件的能力。将单元测试从敏捷开发和极限编程过程中的“绊脚石”,转化成为企业在软件开发过程中的源动力。


  • By TT
  • 2021.09.18 
  • Wings  单元测试  
最新资讯